4、对称排序

题目 对称排序

image-fb0dccb6

思路分析

简单题有简单题的写法 一开始聪明反被聪明误了 浪费蛮多时间的

1 2 3 4

4 3 2 1

一开始是从最终状态来考虑的

最终状态应该是排好序的 小的在下标小处 大的在下标大处

当时遗漏了一个点 就是数可能不是与下标数一一对应的

就写出了这种写法

// #include<bits/stdc++.h>
// using namespace std;
// #define endl '\n'

// const int N=1e5+10;
// int a[N];

// int main()
// {
//     ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
//     int n;cin>>n;
//     for(int i=1;i<=n;i++){
//         cin>>a[i];
//     }
//     for(int i=1;i<=n;i++){
//         if(i!=a[i] || i!=a[(n+1)-i]){
//             cout<<"NO"<<endl;
//             return 0;
//         }
//     }
//     cout<<"YES"<<endl;
//     return 0;
// }

只要当前位置的下标与数不对应 且与要交换处下标里的数不对应 就说明一定不会有序

因为数并不是1~n里面全出现 且只一次 这种写法就会出现问题

所以只能朴素去写(简单题有简单题的写法 别乱优化 而且还没测试案例 又不知道对不对 怎么死的都不知道)

——发现当前位置的数比交换处的数更大 就交换 记得只要枚举一半 不然又换回去了

代码实现

#include<bits/stdc++.h>

using namespace std;

#define endl '\n'

const int N=1e5+10;

int a[N];

int b[N];

int main()

{

    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);

    int n;cin>>n;

    for(int i=1;i<=n;i++)

        cin>>a[i];

    memcpy(b,a,sizeof a);

    sort(b+1,b+1+n);

    for(int i=1;2*i<=n;i++){

        if(a[i]>a[(n+1)-i]){

            swap(a[i],a[(n+1)-i]);

        }

    }

    for(int i=1;i<=n;i++){

        if(a[i]!=b[i]){

            cout<<"NO"<<endl;

            return 0;

        }

    }

    cout<<"YES"<<endl;

    return 0;

}

同类题型

视频讲解


⬅️ 3、蛋糕大作战 🏠 00-刷题理模型 ➡️ 5、最大花之能量